package main

func main() {
	/*
		实现接口条件
		条件一：接口的方法与实现接口的类型方法格式一致, 包括方法中的名称、参数列表、返回值列表。
		条件二：接口中所有方法均被实现。当一个接口中有多个方法时，只有这些方法都被实现，接口才能被正确编译使用。

		关系：
		1.一个类型可以实现多个接口
		2.多个类型可以实现相同一个接口
		3.一个类型中的某个方法，可以实现自不同的接口。因为有些接口定义的方法除了接口名称为全都一样，所以类型可以转为其中任意接口
		参考：d2_impl4案例

		常见的接口的使用有
		1. 动态类型:也就是类型的变量可以为接口 参考：d2_impl1案例
		2. 动态调用：因为接口是动态的，所以通过调用接口的方法调用type实现的方法 参考：d2_impl1案例
		3. 接口嵌套组合：例如一个类型实现两个接口的方法，或者一个接口内部包含了两个接口参考：d2_impl2 和 d2_impl3
			type Writer interface {
				Write(p []byte)(n int, err error)
			}
			type Closer interface {
				Closer() error
			}
			type WriteCloser interface {
				Writer
				Closer
			}
		 4. 类型断言：参考d2_impl5
			类型断言是一个使用在接口值上的操作，用于检查接口类型变量所持有的值是否实现了期望的接口或者具体的类型。
			类型断言的语法：value, ok := x.(T)（x表示一个接口的类型，T表示一个具体的类型（也可以为接口类型））。
			该断言表达式会返回x的值（也就是value），和一个布尔值（即ok），可根据该布尔值判断x是否为T类型：
			（1）若T是具体某个类型，类型断言会检查x的动态类型，是否等于具体类型T。若相等，则返回x的动态值，其类型是T。
			（2）若T是接口类型，类型断言会检查x的动态类型是否满足T，若满足，x的动态值不会被提取，返回值是一个类型为T的接口值 。
			（3）无论T是什么类型，若x是nil接口值，类型断言都会失败。

		编译检查：当把具体的类型赋值给接口的时候，如果该类型没有实现接口的所有方法时，就会编译报错

		接口内存逃逸：由于接口中保存的是具体的实体类型的指针，所以当分配到栈上的值复制给指针时，就会发生内存逃逸。

	*/

}
